/////////////////////////引用
//#include<iostream>
//using namespace std;
//void Test()
//{
//	int a = 10;
//	int& b = a;//引用
//	cout << a << endl;
//	cout << b << endl;
//	cout << &a << endl;
//	cout << &b << endl;
//	cout << endl;//打印空格
//	a++;
//	cout << a << endl;
//	cout << b << endl;
//	cout << &a << endl;
//	cout << &b << endl;
//}
//int main()
//{
//	Test();
//	return 0;
//}

////////////////////////引用多个实体 报错
//#include<iostream>
//using namespace std;
//int main()
//{
//	int a = 1;
//	//int aa;未初始化，编译器会报错
//	int& aa = a;
//	int& aaa = a;
//	printf("%p %p %p\n", &a, &aa, &aaa);
//	//可见，一个变量可以有多个引用
//
//	int b = 10;
//	a = b;
//	printf("%p", &b);
//	return 0;
//}

//#include<iostream>
//using namespace std;
//int main()
//{
//	const int a = 10;
//	//int& ra = a;//该语句编译时错误，a为常量，只能读，引用后就可读可写，ra引用a将放大权限，权限只能缩小，不能放大，所以报错
//	const int& ra = a;// √
//
//	//int& b = 10;//编译报错，一样的10是常量，因为b引用10会放大权限
//	const int& b = 10;//这样写就没问题了 √
//
//	double c = 10.1;
//	//int& rc = c;//报错，c是double类型，因为类型不同，转换为int类型会发生隐式转换，不会改变b，但会生成临时变量，临时变量具有常性
//	const int& rc = c;//没问题 √
//}

/////////////////////////////////引用的应用场景
//#include<iostream>
//using namespace std;
//void Swap(int& a, int& b)
//{
//	int tmp = a;
//	a = b;
//	b = tmp;
//}
//int main()
//{
//	int x = 1;
//	int y = 2;
//	Swap(x, y);
//	cout << x << endl;
//	cout << y << endl;
//	return 0;
//}
//#include <iostream>
//using namespace std;
//
//int& returnValue(int& x) {
//	x *= 2;
//	return x;
//}
//
//int main() {
//	int num = 5;
//	cout << "Before: " << num << endl;
//
//	int& ref = returnValue(num);
//	cout << "After: " << num << endl;
//	cout << "Reference: " << ref << endl;
//
//	ref = 10; // 修改了引用，也会影响原始值
//	cout << "After modifying reference: " << num << endl;
//
//	return 0;
//}

////////引用陷阱
//#include<iostream>
//using namespace std;
//int& add(int a, int b)
//{
//	int c = a + b;
//	return c;
//}
//int main()
//{
//	int& ret = add(1, 2);
//	add(3, 4);
//	cout << "add(1,2)==" << ret << endl;
//	return 0;
//}
///////////////////////////////////////传值、传引用效率比较
//#include <time.h>
//struct A { int a[10000]; };
//void TestFunc1(A a) {}
//void TestFunc2(A& a) {}
//void TestRefAndValue()
//{
//	A a;
//	// 以值作为函数参数
//	size_t begin1 = clock();
//	for (size_t i = 0; i < 10000; ++i)
//		TestFunc1(a);
//	size_t end1 = clock();
//	// 以引用作为函数参数
//	size_t begin2 = clock();
//	for (size_t i = 0; i < 10000; ++i)
//		TestFunc2(a);
//	size_t end2 = clock();
//	// 分别计算两个函数运行结束后的时间
//	cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;
//	cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
//}